/**
 * 
 */
package com.zhangjihao.utils;

/**
 * 说明：
 * 
 * @author  zhangjihao(mailto:zhangjihao@sohu.com)
 * @version v1.0
 * 创建于：2020年4月23日 下午3:45:19
 */
public final class StringUtil {

	/**验证邮箱正则**/
	public static String REGEX_EMAIL = "^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";

	/**验证电话号码正则**/
	public static String REGEX_PHONE = "^(((13[0-9])|(14[579])|(15([0-3]|[5-9]))|(16[6])|(17[0135678])|(18[0-9])|(19[89]))\\d{8})$";
	
	
	/**
	 * 功能：检查包含空白字符在内的字符系列长度  <br>
	 * 示例：  <br>
	 * StringUtil.hasLength(null) -> false  <br>
	 * StringUtil.hasLength("") -> false  <br>
	 * StringUtil.hasLength(" ") -> true  <br>
	 * StringUtil.hasLength("Hello") -> true  <br>
	 * 
	 * @param src
	 * @return boolean
	 */
	public static boolean hasLength(CharSequence  src){
		//短路运算
		return src != null && src.length() > 0;
	}

	
	/**
	* 功能：检查包含空白字符在内的字符系列长度，并处理过滤前后空格  <br>
	* 示例：  <br>
	* StringUtil.hasText(null) -> false  <br>
	* StringUtil.hasText("") -> false  <br>
	* StringUtil.hasText(" ") -> false  <br>
	* StringUtil.hasText("Hello") -> true  <br>
	*/
	public static boolean hasText(String src){
	    return src != null && src.trim().length() > 0;
	}
	
	
	/**
	* 功能：验证是否为合格邮箱  <br>
	* 示例：  <br>
	* StringUtil.isEmail(null) -> false  <br>
	* StringUtil.isEmail("") -> false  <br>
	* StringUtil.isEmail("zhangjihao@") -> false  <br>
	* StringUtil.isEmail("zhangjihao@sohu") -> false  <br>
	* StringUtil.isEmail("zhangjihao@sohu.com") -> true  <br>
	* 
	* @param email
	* @return boolean
	*/
	public static boolean isEmail(String email){
	    return email != null && email.matches(REGEX_EMAIL);
	}
	

	/**
	* 功能：验证是否为合格邮箱  <br>
	* 示例：  <br>
	* StringUtil.isPhone(null) -> false  <br>
	* StringUtil.isPhone("") -> false  <br>
	* StringUtil.isPhone("14312039428") -> false  <br>
	* StringUtil.isPhone("13900139000") -> true  <br>
	* 
	* @param phone
	* @return boolean
	*/
	public static boolean isPhone(String phone){
		return phone != null && phone.matches(REGEX_PHONE);
	}
	
	
	/**
	* 功能：判断是否全部为字母  <br>
	* 示例：  <br>
	* StringUtil.isLetter(null) -> false  <br>
	* StringUtil.isLetter("") -> false  <br>
	* StringUtil.isLetter(".com") -> false  <br>
	* StringUtil.isLetter("howSun") -> true  <br>
	* 
	* @param src
	* @return boolean
	*/
	public static boolean isLetters(String src){
	   return src != null && src.matches("[a-zA-Z]+");
	}
	
	
	/**
	* 功能：反转字符串  <br>
	* 示例："abcd" → "dcba"  <br>
	*
	* @param src 源字符串
	* @return String 反转的字符串
	*/
	public static String reverse(String src){
	    if(!hasText(src)){
	    	return src;
	    }
	    
	    char[] chars = src.toCharArray();
	    
	    //算法：找到字符串中点位置，然后左右交换
	    int mid = chars.length / 2;
	    for (int i = 0; i < mid; i++) {
	    	int rightIndex = chars.length - i - 1;
	    	char left = chars[i];
	    	char right = chars[rightIndex];

	    	//将左边的值放入临时变量
	    	char temp = left;
	    	
	    	//开始交换
			chars[i] = right;
			chars[rightIndex] = temp;
		}
	    
	    return new String(chars);
	}
	
	
	/**
	 * 功能：隐藏字符串<br>
	 * 示例：StringUtil.hidden("13856237928", 3,7) -> "138****7928"<br>
	 *   <br>
	 * @param src 参数1：源字符串<br>
	 * @param start 从开始的位置隐藏，如果为空，则全部不隐藏，<br>
	 * @param end 结束位置，如果为空或为-1，则直到末尾都隐藏，如果超过源字符串长度，则只到末尾<br>
	 * 
	 * @return String 隐藏的结果
	 */
	public static String hidden(String src, Integer start, Integer end){
		if(src == null){
			return src;
		}
		
		StringBuffer result = new StringBuffer();

		if(end == null){
			end = src.length();
		}
		
		char[] chars = src.toCharArray();
		for (int i = 0; i < chars.length; i++) {
			result.append((start != null && start <= i && i < end) ? '*' : chars[i]);
		}

		return result.toString();
	}
}
